import { hideLoading, showLoading, showModal, showToast } from "@/uni_modules/deary-utils/js_sdk/uniapp.js";
import { getToken } from "@/utils/storage";
import { useUserStore } from "@/store/user";

import { APP_BASE_API } from "@/config";

// 请求数量
let nNumberOfRequests = 0;
// 请求动画白名单
const aLoadingWhiteList = [];
// 提示信息白名单
const msgWhiteList = [];
// 不需要添加公共参数的白名单
const whiteList = [];

/**
 * 开始动画
 */
function sLoadingAnimation() {
  // 如果请求数量等于 0，则开始动画
  if (nNumberOfRequests === 0) {
    showLoading("加载中...");
  }
  // 请求数量++
  nNumberOfRequests++;
}

/**
 * 结束动画
 */
function eLoadingAnimation() {
  // 请求数量--
  nNumberOfRequests--;
  // 如果请求数量小于等于 0，则结束动画
  if (nNumberOfRequests <= 0) {
    hideLoading();
  }
}

export class Http {
  // eslint-disable-next-line no-useless-constructor
  constructor() {

  }

  request({
    url,
    data = {},
    method,
    header,
    callback = ""
  } = {}) {
    // 后台请求接口的公共部分
    const baseUrl = APP_BASE_API;

    return new Promise((resolve, reject) => {
      // 请求拦截器开始动画
      // 开始动画
      if (aLoadingWhiteList.indexOf(url) === -1) {
        sLoadingAnimation();
      }
      // 根据白名单判断是否需要添加公共参数
      if (whiteList.indexOf(url) === -1) {

      }

      uni.request({
        url: baseUrl + url,
        data,
        method,
        header: {
          "Content-Type": "application/json; charset=UTF-8;",
          Authorization: getToken() ? "Bearer " + getToken() : "",
          ...header
        },
        callback,
        fail(res) {
          reject(res);
        },
        complete: res => {
          const {
            statusCode,
            data: resData
          } = res;
          // 结束动画
          if (aLoadingWhiteList.indexOf(url) === -1) {
            eLoadingAnimation();
          }
          // callback token过期后重新请求接口，接口返回的数据
          if (callback) return callback(resData);

          if (statusCode === 200) {
            const {
              code,
              msg
            } = resData;

            // 后端成功时返回 code = 0
            if (code === 0) {
              resolve(resData);
            } else if (code === 401) {
              const userStore = useUserStore();
              userStore.removeLoginInfo().then(() => {
                // 登录失效是否重新登录弹窗
                showModal("提示", "登录失效，请重新登录", res => {
                  if (res.confirm) {
                    uni.reLaunch({
                      url: "/pages/login/login"
                    });
                  } else if (res.cancel) {
                    console.log("用户点击取消");
                  }
                }, false);
              });
              reject(resData);
            } else {
              if (msgWhiteList.indexOf(url) === -1) {
                showToast(msg);
              }
              reject(resData);
            }
          } else {
            showToast("网络错误");
            reject(resData);
          }
        }
      });
    });
  }
}
